/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.personas.pacientes;

import hibernate.Busqueda;
import java.util.*;
import modelo.CriterioBusqueda;
import modelo.patologias.Enfermedad;
import modelo.patologias.GestorEnfermedad;
import modelo.personas.GestorDocumento;
import modelo.personas.GestorPersonaFisica;
import modelo.personas.PersonaFisica;

/**
 *
 * @author raul
 */
public class GestorPariente {
    private Pariente modelo;
    private String oldParentesco;
    private HashMap<String, String> mapFiltros;
    private GestorPersonaFisica gestorPersona = new GestorPersonaFisica();

    public GestorPariente() {
        mapFiltros = new HashMap();
        mapFiltros.put("Nro Documento", "doc.numero");
        mapFiltros.put("Nombre", "nombre");
        mapFiltros.put("Apellido","apellido");
    }

    public Pariente getModelo() {
        return modelo;
    }

    public void setModelo(Pariente modelo) {
        oldParentesco = modelo.getParentesco()!=null? modelo.getParentesco().getNombre(): null;
        gestorPersona.setModelo(modelo.getPersona());
        this.modelo = modelo;
    }

    public boolean isPaciente() {
        return modelo.getPersona() instanceof Paciente;
    }
    
    public void crearModelo() {
        Pariente pariente = new Pariente();
        pariente.setPersona(new PersonaFisica());
        this.setModelo(pariente);
    }
    
    public void deshacerCambios() {
        if (!isPaciente()) {//Porque si es paciente entonces no pudo cambiar la persona
            gestorPersona.deshacerCambios();
        }
        modelo.setParentesco((Parentesco)(new GestorParentesco()).buscar("Nombre", oldParentesco).get(0));
    }

    public List getEnfermedades() {
        List enfermedades = new ArrayList();
        Iterator<DetalleHistoriaClinica> i = modelo.getEnfermedades().iterator();
        while (i.hasNext()) {
            enfermedades.add(i.next().getEnfermedad());
        }
        return enfermedades;
    }
    
    //TODO: un poco ineficiente, ver si se puede mejorar
    public void setEnfermedades(List enfermedades) {
        modelo.getEnfermedades().clear();
        Iterator<Enfermedad> i = enfermedades.iterator();
        while (i.hasNext()) {
            DetalleHistoriaClinica dhc = new DetalleHistoriaClinica();
            dhc.setEnfermedad(i.next());
            modelo.getEnfermedades().add(dhc);
        }
    }
    
    public List listarParentescos() {
        return (new GestorParentesco()).listarParentescos();
    }        
    
    public void setDocumento(int numero) {
        GestorDocumento gestorD= new GestorDocumento();
        gestorD.crearModelo();
        gestorD.getModelo().setTipo("");
        gestorD.getModelo().setNumero(numero);
        getModelo().getPersona().setDocumento(gestorD.getModelo());
    }

    public void setParentesco(Object parentesco) {
        modelo.setParentesco((Parentesco) parentesco);
    }

    public List buscarEnfermedad(String enfermedad) {
        GestorEnfermedad gestorE = new GestorEnfermedad();
        return gestorE.buscar("Nombre", enfermedad);
    }

    public boolean existePersona(CriterioBusqueda[] criterios, Object paciente) {
        
        Object persona = buscarPersona(criterios);
        //si se encontro la persona y no es el mismo paciente
        if(persona != null && !persona.equals(paciente)) {
            modelo.setPersona((PersonaFisica) persona);//setear a la persona como pariente
            gestorPersona.setModelo(modelo.getPersona());
//            if (persona instanceof Paciente) {
//                modelo.setEnfermedades(
//                        ((Paciente) persona).getHistoriaClinica().getDetallesHistoriaClinica());
//            }
            return true;
        } else {
            return false;
        }
    }

    public Object buscarPersona(CriterioBusqueda[] criterios) {
        Busqueda b = new Busqueda(PersonaFisica.class);
        b.crearAlias("documento", "doc");
        for (CriterioBusqueda c : criterios) {
            if (c.getValor() instanceof String) {
                b.addIlike(mapFiltros.get(c.getFiltro()), (String) c.getValor());
            } else {
                b.addEq(mapFiltros.get(c.getFiltro()), c.getValor());
            }
        }
        return b.ejecutarUnique();
    }
    
    public boolean validaModelo(GestorPaciente gestorPariente){
        boolean valida = modelo.getParentesco().getNombre().equals(oldParentesco) ||
                !gestorPariente.tienePariente(modelo);
        if (!isPaciente()) {
            return gestorPersona.validaModelo() && valida;
        } else {
            return valida;
        }
    }

}
